# Git
## Конфигурация
    ~ git config --global user.name "Name"
    ~ git config --global user.email email@.com
        --global - отвечает за настройки для всех репозиториев
        --local - только для локалльного репозитория


## Инфо
### Файлы в репозитории могут быть в состояниях:
* tracked(отслеживаемые)
* untracked(не отслеживаемые)   
* modified(изменённые)
* staged (подготовленные к сохранению), после команды git add file
* commited(сохранёные)*

### Статус ветки, репозитория и файлов
    ~ git status

### Отображение истории комитов                               
    ~ git log

### Детальная информация об изменениях которые записаны в коммите
    ~ git show [HASH_COMMIT]

### Показывает изменения в файлах которые не закомичены
    ~ git diff


## Работа
    # Инициализация репозитория
    ~ git init

    # Посмотреть состояние промежуточного индекса
    ~ git ls-files
        ~ git ls-files -s - Вывод с именами файлов 

    # Добавить файлы в статус staged
    ~ git add [FILE] [FILE] 
        ~ git add . - Добавить изменённые файлы в комит
    
    # Убрать все файл из статуса staged (git add)
    ~ git restore [FILE] [FILE]
        ~ git restore --staged [FILE] [FILE] - Убрать статус staged и все изменения в индексе
       
    # Произвести коммит
    ~ git commit -m [MESSAGE]
        ~ git commit -am [MESSAGE] - Сокращённая форма git add и git commit
        ~ git commit --amend - Выполняет откат на коммит и создаёт новый комит. Выполняет git reset --sott @~ и git commit -c ORIG_HEAD

    # Переносит или переименовывает файлы и каталоги
    ~ git mv [OLD_PATH] [NEW_PATH]

    # Удаляет Файлы 
    ~ git rm [PATH]
        ~ git rm --cached [PATH] - Удаляет файл из индекса соммита
        ~ git rm -r - Рекурсивное удаление
    
    # Вернут на commit назад
    ~ git reset [HASH_COMMIT | NAME COMMIT]
        ~ git reset @~ - Один коммит назад
        ~ git reset --hard [HASH_COMMIT | NAME COMMIT] - Жёсткий вариант. Откатиться на комит и удалить все не закомиченные изменения
        ~ git reset --soft [HASH_COMMIT | NAME COMMIT] - Переходит на указаный комит при этом оставляет все ранее закомиченные изменения


### Ветки
    ~ git branch [BRAUNCH_NAME] - Создаёт ветку
        ~ git branch -a - Показывает все ветки в репозитории
        ~ git branch -d [BRAUNCH_NAME] - Удаляет ветку
    
    ~ git checkout [BRAUNCH_NAME] - Переключение на ветку
        ~ git checkout -b [BRAUNCH_NAME] - Создать и переключиться на ветку


### Удалённый репозиторий
    ~ git clone [URL_REPO] - Клонировать репозиторий
    
    ~ git remote -v - Список удалённых репозиториев
    ~ git fetch [REMOTE_NAME] - Загрузить объекты из другого репозитория
        ~ git fetch -a - Все репозитории


### Слияние
    ~ git merge [BRAUNCH_NAME] - При этом необходимо находится в ветке в которую хотите слить [BRAUNCH_NAME]

    ~ git merge-base [BRAUNCH_NAME] [BRAUNCH_NAME] - Последний общий коммит
    ~ git checkout --ours [FILE] - Вывести в рабочую область файл конфликта из master
    ~ git checkout --theirs [FILE] - Вывести в рабочую область файл конфликта из сливаемой ветки
    ~ git checkout --merge [FILE] - Продолжить процесс слияния с маркерами конфликта 
    ~ gir merge --abort - Отменить слияние не удаляя индекс
    ~ git reset --hard - Прекратить слияние и удалить весь индекс

    После устранения конфликтов сделать:
    git add .
    git commit -m "" или
    git merge --continue


### Перебазирование
    ~ git rebase [BRAUNCH_NAME] - При этом необходимо находится в ветке которую хотите перебазировать.
    
    ~ git rebase --abort - Отменить перебазирование и вернутся назад

    git push [REMOTE_NAME] [BRAUNCH_NAME] -f - Принудительно переписать историю коммитов на удалённом репозитории


## .gitignore
Все пути должны быть указаны относительно .gitignore
 - path_dir/ - директория
 - path_dir/file.txt - Файл
 - dir/** - Все файлы в директории
 - file.* - Все файлы file c любым расширением

# Несколько учётный записей на пк
**Редактировать .gitconfig**

    ~ cat .gitconfig
    [user]
        name = username
        email = useremail@gmail.com
    [includeIf "gitdir/i:~/Work/**"]
        path = .gitconfig-work
    [includeIf "gitdir/i:~/Hobby/**"]
        path = .gitconfig-hobby

**Создать кофниги под каждый профиль**
    
    ~ cat .gitconfig-work
    [user]
        name = username
        email = useremail@gmail.com
    ~ cat .gitconfig-hobby
    [user]
        name = username
        email = useremail@gmail.com
**Сгенировать ключи**
    
    ~ ssh-keygen -t ed25519 -C "useremail@gmail.com"

**Создать ~/.ssh/config**
    
    ~ cat ~/.ssh/config
    Host workhost
        Hostname workhost
        User username/useremail
        IdentityFile ~/.ssh/work_id_rsa
        IdentitiesOnly yes

    Host github.com
        Hostname github.com
        User username/useremail
        IdentityFile ~/.ssh/github
        IdentitiesOnly yes

    Host notabug.org
        Hostname notabug.org
        User username/useremail
        IdentityFile ~/.ssh/github
        IdentitiesOnly yes